package main
import (
	"fmt"
	"encoding/json"
)
//强调！！type出新的数据类就是一个新的，与原来被重名的类型不同类
type A struct {
	Num int
}
type B struct {
	Num int
}

//struct 的每一个字段可以写一个tag，该tag通过反射机制来进行序列化或反序列化！！！！
//将struct变量进行 json 处理！！！
//如果下面的字段是小写开头就不能被其他工具函数调用！所以必须大写
type Monster struct{
	Name string `json:"name"`    //tag标签，备注json名字换成name
	Age int	`json:"age"`
	Address string `json:"address`
}
type AA A //AA 相当于一个新的类型，不能直接赋值给 A 的实例对象，不过可以通过强转赋值，与上面的差不多的原理！！
func main(){
	var a A 
	var b B 
	a = A(b)  //因为B的结构体与A的结构体具有完全相同字段 （包括，类型，名字，个数！）,故可以强转

	//结构体可以进行 type 重新定义
	
	var aa AA 
	aa = AA(a)
	fmt.Println(aa)

	monster := Monster{"mary",100,"Beijing"}
	//将monster序列化成字符串
	JsonMonster,err := json.Marshal(monster) //使用到了反射！
	if err != nil{
		fmt.Println("Error!")
	}else {
		//若没有用tag更改成小写字段，则序列化后为大写的JSON :  {"Name":"mary","Age":100,"Address":"Beijing"} 字段开头大写，不适于其他程序使用
		//tag后序列化后就是JSON :  {"name":"mary","age":100,"Address":"Beijing"}
		fmt.Println("JSON : ",string(JsonMonster))
	}
}